
module SineTable(
  input  wire       clk,
  input  wire       rst_n,
  input  wire       wf,
  input  wire [8:0] addr,
  output reg  [7:0] data
);

reg[6:0] sin_data;
always @(*)begin
    case(addr[6:0])
    7'h00: sin_data = 7'b1111111;
    7'h01: sin_data = 7'b1100101;
    7'h02: sin_data = 7'b1010101;
    7'h03: sin_data = 7'b1001100;
    7'h04: sin_data = 7'b1000101;
    7'h05: sin_data = 7'b1000000;
    7'h06: sin_data = 7'b0111100;
    7'h07: sin_data = 7'b0111000;
    7'h08: sin_data = 7'b0110101;
    7'h09: sin_data = 7'b0110011;
    7'h0a: sin_data = 7'b0110000;
    7'h0b: sin_data = 7'b0101110;
    7'h0c: sin_data = 7'b0101100;
    7'h0d: sin_data = 7'b0101010;
    7'h0e: sin_data = 7'b0101000;
    7'h0f: sin_data = 7'b0100111;
    7'h10: sin_data = 7'b0100101;
    7'h11: sin_data = 7'b0100100;
    7'h12: sin_data = 7'b0100011;
    7'h13: sin_data = 7'b0100001;
    7'h14: sin_data = 7'b0100000;
    7'h15: sin_data = 7'b0011111;
    7'h16: sin_data = 7'b0011110;
    7'h17: sin_data = 7'b0011101;
    7'h18: sin_data = 7'b0011100;
    7'h19: sin_data = 7'b0011011;
    7'h1a: sin_data = 7'b0011010;
    7'h1b: sin_data = 7'b0011010;
    7'h1c: sin_data = 7'b0011001;
    7'h1d: sin_data = 7'b0011000;
    7'h1e: sin_data = 7'b0010111;
    7'h1f: sin_data = 7'b0010110;
    7'h20: sin_data = 7'b0010110;
    7'h21: sin_data = 7'b0010101;
    7'h22: sin_data = 7'b0010100;
    7'h23: sin_data = 7'b0010100;
    7'h24: sin_data = 7'b0010011;
    7'h25: sin_data = 7'b0010011;
    7'h26: sin_data = 7'b0010010;
    7'h27: sin_data = 7'b0010001;
    7'h28: sin_data = 7'b0010001;
    7'h29: sin_data = 7'b0010000;
    7'h2a: sin_data = 7'b0010000;
    7'h2b: sin_data = 7'b0001111;
    7'h2c: sin_data = 7'b0001111;
    7'h2d: sin_data = 7'b0001110;
    7'h2e: sin_data = 7'b0001110;
    7'h2f: sin_data = 7'b0001110;
    7'h30: sin_data = 7'b0001101;
    7'h31: sin_data = 7'b0001101;
    7'h32: sin_data = 7'b0001100;
    7'h33: sin_data = 7'b0001100;
    7'h34: sin_data = 7'b0001011;
    7'h35: sin_data = 7'b0001011;
    7'h36: sin_data = 7'b0001011;
    7'h37: sin_data = 7'b0001010;
    7'h38: sin_data = 7'b0001010;
    7'h39: sin_data = 7'b0001010;
    7'h3a: sin_data = 7'b0001001;
    7'h3b: sin_data = 7'b0001001;
    7'h3c: sin_data = 7'b0001001;
    7'h3d: sin_data = 7'b0001000;
    7'h3e: sin_data = 7'b0001000;
    7'h3f: sin_data = 7'b0001000;
    7'h40: sin_data = 7'b0001000;
    7'h41: sin_data = 7'b0000111;
    7'h42: sin_data = 7'b0000111;
    7'h43: sin_data = 7'b0000111;
    7'h44: sin_data = 7'b0000110;
    7'h45: sin_data = 7'b0000110;
    7'h46: sin_data = 7'b0000110;
    7'h47: sin_data = 7'b0000110;
    7'h48: sin_data = 7'b0000101;
    7'h49: sin_data = 7'b0000101;
    7'h4a: sin_data = 7'b0000101;
    7'h4b: sin_data = 7'b0000101;
    7'h4c: sin_data = 7'b0000101;
    7'h4d: sin_data = 7'b0000100;
    7'h4e: sin_data = 7'b0000100;
    7'h4f: sin_data = 7'b0000100;
    7'h50: sin_data = 7'b0000100;
    7'h51: sin_data = 7'b0000100;
    7'h52: sin_data = 7'b0000011;
    7'h53: sin_data = 7'b0000011;
    7'h54: sin_data = 7'b0000011;
    7'h55: sin_data = 7'b0000011;
    7'h56: sin_data = 7'b0000011;
    7'h57: sin_data = 7'b0000011;
    7'h58: sin_data = 7'b0000010;
    7'h59: sin_data = 7'b0000010;
    7'h5a: sin_data = 7'b0000010;
    7'h5b: sin_data = 7'b0000010;
    7'h5c: sin_data = 7'b0000010;
    7'h5d: sin_data = 7'b0000010;
    7'h5e: sin_data = 7'b0000010;
    7'h5f: sin_data = 7'b0000001;
    7'h60: sin_data = 7'b0000001;
    7'h61: sin_data = 7'b0000001;
    7'h62: sin_data = 7'b0000001;
    7'h63: sin_data = 7'b0000001;
    7'h64: sin_data = 7'b0000001;
    7'h65: sin_data = 7'b0000001;
    7'h66: sin_data = 7'b0000001;
    7'h67: sin_data = 7'b0000001;
    7'h68: sin_data = 7'b0000001;
    7'h69: sin_data = 7'b0000000;
    7'h6a: sin_data = 7'b0000000;
    7'h6b: sin_data = 7'b0000000;
    7'h6c: sin_data = 7'b0000000;
    7'h6d: sin_data = 7'b0000000;
    7'h6e: sin_data = 7'b0000000;
    7'h6f: sin_data = 7'b0000000;
    7'h70: sin_data = 7'b0000000;
    7'h71: sin_data = 7'b0000000;
    7'h72: sin_data = 7'b0000000;
    7'h73: sin_data = 7'b0000000;
    7'h74: sin_data = 7'b0000000;
    7'h75: sin_data = 7'b0000000;
    7'h76: sin_data = 7'b0000000;
    7'h77: sin_data = 7'b0000000;
    7'h78: sin_data = 7'b0000000;
    7'h79: sin_data = 7'b0000000;
    7'h7a: sin_data = 7'b0000000;
    7'h7b: sin_data = 7'b0000000;
    7'h7c: sin_data = 7'b0000000;
    7'h7d: sin_data = 7'b0000000;
    7'h7e: sin_data = 7'b0000000;
    7'h7f: sin_data = 7'b0000000;        
    endcase
end

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
         data <= #1 8'b0;
    else if(addr < 9'd256)
         data <= #1 {1'b0, sin_data};
    else 
         if(!wf)
             data <= #1 {1'b1, sin_data};
         else
             data <= #1 8'hFF; 
end

endmodule
